#ifndef __COMMON_H__
#define __COMMON_H__

#include <sys/types.h>
#include <arpa/inet.h>

#define DEFAULT_SNAPLEN 1536

int calculate_checksum(u_int16_t *data, int byte_len_data);
float calculate_time_interval(struct timeval *tv_request, struct timeval *tv_reply);

struct FRAME_HEADER
{
    u_int8_t dmac[6]; //目的mac
    u_int8_t smac[6]; //源mac
    u_int16_t type;   //类型或者长度
};

// 定义ip 头部结构体
struct IP_HEADER
{
    u_int8_t vension_and_header;    //版本信息(前4位)，头长度(后4位)
    u_int8_t type_of_service;       // 服务类型8位
    u_int16_t lenght_of_packet;     //数据包长度
    u_int16_t id;                   //数据包标识
    u_int16_t flags_and_slice_info; //分片信息
    u_int8_t ttl;                   //存活时间
    u_int8_t type_of_protocol;      //协议类型
    u_int16_t checksum;             //校验和
    struct in_addr sour_ip;         //源ip
    struct in_addr dest_ip;         //目的ip
};

// 定义icmp报文结构体
struct ICMP_ECHO
{
    // icmp head
    u_int8_t type;      //类型
    u_int8_t code;      //代码
    u_int16_t checksum; //校验和
    u_int16_t ident;    //识别码，一般为pid
    u_int16_t seq;      //序列号
    struct timeval tv;  // 发送时间戳
};

struct TCP_HEADER
{
    u_int16_t sour_port;         //源端口
    u_int16_t dest_port;         //目的端口
    u_int32_t seq;               //序列号
    u_int32_t ack;               //应答号
    u_int8_t lenght_of_header;   //头部长度(注意预留位)
    u_int8_t tag;                //标签
    u_int16_t lenght_of_windows; //窗口长度
    u_int16_t checksum;          //校验码
    u_int16_t urgent_pointer;    //紧急指针
};

struct PING_PACKET
{
    struct FRAME_HEADER frame_header;
    struct IP_HEADER ip_header;
    struct ICMP_ECHO icmp_echo;
};

#endif